﻿#include <iostream>
#include <string>
using namespace std;
/* 对象创建型模式
1.意图
用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象
2.适用性
当一个系统应该独立于它的产品创建、构成和表示时，要使用Prototype模式；以及
a.当要实例化的类是在运行时刻指定时，例如，通过动态装载；或者
b.为了避免创建一个与产品类层次平行的工厂类层次时；或者
c.当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些
*/
//抽象原型类
class Monkey
{
public:
	virtual Monkey* Clone() = 0;
	virtual void Play() = 0;
};
//具体原型类
class SunWuKong:public Monkey
{
public:
	SunWuKong(string name) :m_name(name) {}
	SunWuKong(const SunWuKong& other)
	{
		//默认浅拷贝，当对象中包含指针，并且做了内存申请，必须使用深拷贝，防止指针指向同一地址
		//导致数据不一致或程序崩溃
		m_name = other.m_name; 		
	}
	Monkey* Clone()
	{
		return new SunWuKong(*this);
	}
	void Play()
	{
		cout << m_name << " 七十二般变化 " << endl;
	}
private:
	string m_name;
};
/*
int main()
{
	Monkey* monkey = new SunWuKong("齐天大圣");
	Monkey* monkey1 = monkey->Clone();
	Monkey* monkey2 = monkey->Clone();
	monkey1->Play();
	monkey2->Play();
	delete monkey;
	delete monkey1;
	delete monkey2;
	monkey = nullptr;
	monkey1 = nullptr;
	monkey2 = nullptr;
	return 0;
}
*/